package fr.charlott.business.service.impl;

import java.util.ArrayList;
import java.util.List;

import org.dozer.DozerBeanMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import fr.charlott.business.dto.ClienteDTO;
import fr.charlott.business.dto.HotesseDTO;
import fr.charlott.business.dto.ProduitDTO;
import fr.charlott.business.service.ClienteService;
import fr.charlott.core.repository.model.Cliente;
import fr.charlott.core.repository.model.Hotesse;
import fr.charlott.core.repository.model.Produit;

@Service("clienteService")
public class ClienteServiceImpl implements ClienteService {

    private fr.charlott.core.service.ClienteService clienteService;

    private fr.charlott.core.service.ProduitService produitService;

    private DozerBeanMapper dozerMapper;

    public ClienteServiceImpl() {
        super();
    }

    @Autowired
    public ClienteServiceImpl(fr.charlott.core.service.ClienteService clienteService, fr.charlott.core.service.ProduitService produitService,
            DozerBeanMapper dozerMapper) {
        this();
        this.clienteService = clienteService;
        this.produitService = produitService;
        this.dozerMapper = dozerMapper;
    }

    @Override
    @Transactional
    public void ajouterCliente(ClienteDTO clienteDTO) {
        clienteService.ajouterCliente(dozerMapper.map(clienteDTO, Cliente.class));
    }

    @Override
    @Transactional
    public void importerCliente(ClienteDTO clienteDTO) {
        List<Produit> produits = new ArrayList<Produit>();
        for (ProduitDTO produitDTO : clienteDTO.getProduits()) {
            Produit produit = produitService.ajouterProduit(dozerMapper.map(produitDTO, Produit.class));
            produits.add(produit);
        }
        Cliente cliente = dozerMapper.map(clienteDTO, Cliente.class);
        cliente.setProduits(produits);
        clienteService.ajouterCliente(cliente);
    }

    @Override
    @Transactional
    public void supprimerCliente(ClienteDTO clienteDTO) {
        if (clienteService.chercherParId(clienteDTO.getId()) != null) {
            clienteService.supprimerCliente(dozerMapper.map(clienteDTO, Cliente.class));
        }
    }

    @Override
    @Transactional
    public void supprimerToutesLesClientes() {
        clienteService.supprimerToutesLesClientes();
    }

    @Override
    public ClienteDTO chercherParId(Long id) {
        Cliente cliente = clienteService.chercherParId(id);
        if (cliente != null) {
            return dozerMapper.map(cliente, ClienteDTO.class);
        }
        return null;
    }

    @Override
    @Transactional(readOnly = true)
    public ClienteDTO chercherParNomPrenom(String nom, String prenom) {
        Cliente cliente = clienteService.chercherParNomPrenom(nom, prenom);
        if (cliente != null) {
            return dozerMapper.map(cliente, ClienteDTO.class);
        }
        return null;
    }

    @Override
    @Transactional(readOnly = true)
    public List<ClienteDTO> chercherParHotesse(HotesseDTO hotesseDTO) {
        List<ClienteDTO> listeClientes = new ArrayList<ClienteDTO>();
        for (Cliente cliente : clienteService.chercherParHotesse(dozerMapper.map(hotesseDTO, Hotesse.class))) {
            listeClientes.add(dozerMapper.map(cliente, ClienteDTO.class));
        }
        return listeClientes;
    }

    @Override
    @Transactional(readOnly = true)
    public List<ClienteDTO> chargerToutesLesClientes() {
        List<ClienteDTO> listeClientes = new ArrayList<ClienteDTO>();
        for (Cliente cliente : clienteService.chargerToutesLesClientes()) {
            listeClientes.add(dozerMapper.map(cliente, ClienteDTO.class));
        }
        return listeClientes;
    }

    // getters - setters

    /**
     * @param ClienteMapper
     *            the ClienteMapper to set
     */
    public void setDozerMapper(DozerBeanMapper dozerMapper) {
        this.dozerMapper = dozerMapper;
    }

    /**
     * @param clienteService
     *            the clienteService to set
     */
    @Override
    public void setClienteService(fr.charlott.core.service.ClienteService clienteService) {
        this.clienteService = clienteService;
    }

    /**
     * @param produitService
     *            the produitService to set
     */
    @Override
    public void setProduitService(fr.charlott.core.service.ProduitService produitService) {
        this.produitService = produitService;
    }

}
